From 45e37537620e594f0fb77210a9163e3da246666d Mon Sep 17 00:00:00 2001
From: Daniel Dehennin <daniel.dehennin@baby-gnu.org>
Date: Thu, 12 Apr 2018 00:40:13 +0200
Subject: [PATCH] Gnus Group Mail Spliting on mailing-list headers

* texi/gnus.texi: Document the new `list' split abbreviation and
`match-list' group parameter (bug#25346).

* lisp/gnus-mlspl.el: Use the `list' abbreviation when the new
`match-list' group parameter is set to `t'.
The split regexp is modified to match either `@` or `.` as domain
separator to comply with RFC2919 IDs too.

* lisp/nnmail.el: Add new `list' split abbreviation matching common
mailing-list headers.
---
 doc/misc/gnus.texi      | 18 ++++++++++++++++++
 etc/NEWS                |  5 +++++
 lisp/gnus/gnus-mlspl.el | 25 +++++++++++++++++++------
 lisp/gnus/nnmail.el     |  3 ++-
 4 files changed, 44 insertions(+), 7 deletions(-)

diff --git a/doc/misc/gnus.texi b/doc/misc/gnus.texi
index cc4b2342be..de219c6e56 100644
--- a/doc/misc/gnus.texi
+++ b/doc/misc/gnus.texi
@@ -3102,6 +3102,21 @@ Group Parameters
 The Sieve language is described in RFC 3028.  @xref{Top, Emacs Sieve,
 Top, sieve, Emacs Sieve}.
 
+@item match-list
+@cindex match-list
+If this parameter is set to @code{t} and @code{nnmail-split-method} is
+set to @code{gnus-group-split}, Gnus will match @code{to-address},
+@code{to-list}, @code{extra-aliases} and @code{split-regexp} against
+the @code{list} split abbreviation.  The split regexp is modified to
+match either a @code{@@} or a dot @code{.} in mail addresses to
+conform to RFC2919 @code{List-ID}.
+
+See @code{nnmail-split-abbrev-alist} for the regular expression
+matching mailing-list headers.
+
+See @pxref{Group Mail Splitting} to automatically split on group
+parameters.
+
 @item (agent parameters)
 If the agent has been enabled, you can set any of its parameters to
 control the behavior of the agent in individual groups.  See Agent
@@ -15475,6 +15490,9 @@ Fancy Mail Splitting
 @item any
 Is the union of the @code{from} and @code{to} entries.
 @end table
+@item list
+Matches the @samp{List-ID}, @samp{List-Post}, @samp{X-Mailing-List},
+@samp{X-BeenThere} and @samp{X-Loop} fields.
 
 @vindex nnmail-split-fancy-syntax-table
 @code{nnmail-split-fancy-syntax-table} is the syntax table in effect
diff --git a/lisp/gnus/gnus-mlspl.el b/lisp/gnus/gnus-mlspl.el
index fb45007c12..599b9c61dc 100644
--- a/lisp/gnus/gnus-mlspl.el
+++ b/lisp/gnus/gnus-mlspl.el
@@ -182,7 +182,8 @@ gnus-group-split-fancy
 		    (to-list (cdr (assoc 'to-list params)))
 		    (extra-aliases (cdr (assoc 'extra-aliases params)))
 		    (split-regexp (cdr (assoc 'split-regexp params)))
-		    (split-exclude (cdr (assoc 'split-exclude params))))
+		    (split-exclude (cdr (assoc 'split-exclude params)))
+		    (match-list (cdr (assoc 'match-list params))))
 		(when (or to-address to-list extra-aliases split-regexp)
 		  ;; regexp-quote to-address, to-list and extra-aliases
 		  ;; and add them all to split-regexp
@@ -202,16 +203,28 @@ gnus-group-split-fancy
 			  "\\|")
 			 "\\)"))
 		  ;; Now create the new SPLIT
-		  (push (append
-			 (list 'any split-regexp)
+		  (let ((split-regexp-with-list-ids
+			 (replace-regexp-in-string "@" "[@.]" split-regexp t t))
+			(exclude
 			 ;; Generate RESTRICTs for SPLIT-EXCLUDEs.
 			 (if (listp split-exclude)
 			     (apply #'append
 				    (mapcar (lambda (arg) (list '- arg))
 					    split-exclude))
-			   (list '- split-exclude))
-			 (list group-clean))
-			split)
+			   (list '- split-exclude))))
+
+		    (if match-list
+			;; Match RFC2919 IDs or mail addresses
+			(push (append
+			       (list 'list split-regexp-with-list-ids)
+			       exclude
+			       (list group-clean))
+			      split)
+		      (push (append
+			     (list 'any split-regexp)
+			     exclude
+			     (list group-clean))
+			    split)))
 		  ;; If it matches the empty string, it is a catch-all
 		  (when (string-match split-regexp "")
 		    (setq catch-all nil)))))))))
diff --git a/lisp/gnus/nnmail.el b/lisp/gnus/nnmail.el
index b2c86d35d1..5083fa2487 100644
--- a/lisp/gnus/nnmail.el
+++ b/lisp/gnus/nnmail.el
@@ -515,7 +515,8 @@
     (to . "to\\|cc\\|apparently-to\\|resent-to\\|resent-cc")
     (from . "from\\|sender\\|resent-from")
     (nato . "to\\|cc\\|resent-to\\|resent-cc")
-    (naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc"))
+    (naany . "from\\|to\\|cc\\|sender\\|resent-from\\|resent-to\\|resent-cc")
+    (list . "list-id\\|list-post\\|x-mailing-list\||x-beenthere\\|x-loop"))
   "*Alist of abbreviations allowed in `nnmail-split-fancy'."
   :group 'nnmail-split
   :type '(repeat (cons :format "%v" symbol regexp)))
-- 
2.17.0

